// 数据库相关操作
// 数据库连接
const {
    sequelize
} = require('../model/db');
// user数据模型
const {
    User
} = require('../model/user');
const { EmailCode } = require('../model/emailCode')
const { DataTypes } = require('sequelize');
// 导入数据验证
const { body } = require('express-validator')
const validate = require('../middleware/validate')


// 导入md5加密
const md5 = require('../util/md5')

// 用户登录 数据验证
exports.login = [
    // 用户输入不为空
    validate([
        body('user.username').notEmpty().withMessage('用户名不能为空'),
        body('user.password').notEmpty().withMessage('密码不能为空'),
    ]),
    // 查询数据库中是否存在该账号
    validate([
        // 共享req
        body('user.username').custom(async (username) => {
            // 查询数据库中是否存在相同账号
            let result = await User.findOne({
                where: {
                    username: username
                }
            });
            // 判断查询结果是否不为空
            // 若结果不为空说明账号已存在
            if (result === null) {
                // 返回错误信息
                console.log(`账号登录 ：用户${username}不存在`);
                return Promise.reject(`用户不存在`);
            }
        })
    ]),
    // 查询用户输入的密码是否与数据库中的密码一致
    validate([
        body('user').custom(async (user) => {
            // console.log(req)
            // 查询数据库中是否存在相同账号
            req = user;
            let result = await User.findOne({
                where: {
                    username: user.username,
                    password: md5(user.password)
                }
            });
            // console.log(result)
            // 判断查询结果是否不为空
            // 若结果不为空说明账号已存在
            if (result === null) {
                // 返回错误信息
                console.log(`账号登录 ：用户${user.username}密码错误`);
                return Promise.reject(`账号或密码错误`);
            }
        })
    ]),
]

// 账号注册 数据验证
exports.registeUser = validate([ // 账号不为空
    // .notEmpty 输入不为空判断
    // .withMessage 自定义错误消息
    body('user.username').notEmpty().withMessage("账号不为空")
        .bail() // 前面验证失败就停止执行
        .custom(async username => {
            // 查询数据库中是否存在相同账号
            let result = await User.findOne({
                where: {
                    username: username
                }
            });
            // 判断查询结果是否不为空
            // 若结果不为空说明账号已存在
            if (result !== null) {
                // 返回错误信息
                console.log(`账号注册 ：用户${username}已存在`);
                return Promise.reject(`用户已存在`);
            }

        }),
    // 密码不为空
    body('user.password').notEmpty().withMessage("密码不为空"),
    // 邮箱不为空
    body('user.email').notEmpty().withMessage("邮箱不为空"),
    // 邮箱是否符合邮箱格式
    body('user.email').isEmail().withMessage("邮箱格式不正确").custom(async email => {
        // 查询数据库中是否存在相同邮箱
        let result2 = await User.findOne({
            where: {
                email: email
            }
        })
        // 判断查询结果是否不为空
        // 若结果不为空说明邮箱已存在
        if (result2 !== null) {
            // 返回错误信息
            console.log(`账号注册 ：邮箱${email}已存在`);
            return Promise.reject(`邮箱已存在`);
        }
    }),
])

// 邮箱获取验证码
exports.emailCode = validate([
    body('user.username').notEmpty().withMessage("账号不为空")
        .bail() // 前面验证失败就停止执行
        .custom(async username => {
            // 查询数据库中是否存在相同账号
            let result = await User.findOne({
                where: {
                    username: username
                }
            });
            // 判断查询结果是否不为空
            // 若结果为空说明账号不存在
            if (result == null) {
                // 返回错误信息
                console.log(`重置密码 ：用户${username}不存在`);
                return Promise.reject(`用户不存在`);
            }

        }),
    // 邮箱不为空
    body('user.email').notEmpty().withMessage("邮箱不为空"),
    // 邮箱是否符合邮箱格式
    body('user.email').isEmail().withMessage("邮箱格式不正确").custom(async email => {
        // 查询数据库中是否存在相同邮箱
        let result2 = await User.findOne({
            where: {
                email: email
            }
        })
        // 判断查询结果是否不为空
        // 若结果不为空说明邮箱已存在
        if (result2 === null) {
            // 返回错误信息
            console.log(`邮箱获取验证码 ：邮箱${email}不存在`);
            return Promise.reject(`邮箱 ${email} 不存在`);
        }
    }),
])

// 验证邮箱验证码
exports.verifyEmailCode = validate([
    // 验证码不能为空
    body('user.emailCode').notEmpty().withMessage("验证码不为空").bail() // 前面验证失败就停止执行
        .custom(async emailCode => {
            // 查询数据库中是否存在相同验证码
            let result = await EmailCode.findOne({
                where: {
                    emailCode: emailCode
                }
            });
            // 判断查询结果是否不为空
            // 若结果为空说明账号不存在
            if (result == null) {
                // 返回错误信息
                console.log(`重置密码 ：验证码${emailCode}不存在`);
                return Promise.reject(`：验证码 ${emailCode} 不存在`);
            }

        }),
    // body('user.email').notEmpty().withMessage("邮箱不为空"),
    body('user.password').notEmpty().withMessage("密码不为空")
])